'use strict';

module.exports = app => {
  const { STRING, DATE } = app.Sequelize;

  const User = app.model.define('user', {
    lid               : { type: STRING(30), unique: true },
    avatar            : STRING,
    name              : STRING,
    hashedPassword    : STRING,
    passwordResetToken: STRING,
    resetTokenExpires : DATE,
    lastSignInAt      : DATE,
  }, {
    createdAt: 'createdAt',
    updatedAt: 'updatedAt',
    tableName: 'zconnect-user',
  });

  // 注册用户
  User.register = async function(fields) {
    return this.create(fields);
  };

  // 根据用户密码（hash过的）获取用户
  User.getUser = async function(name, password) {
    return this.authenticate(name, password);
  };

  // 验证用户的密码
  User.authenticate = async function(name, password) {
    const user = await this.findOne({
      where     : { name },
      attributes: ['id', 'name', 'hashedPassword'],
    });
    if (!user) return null;
    return this.ctx.compare(password, user.hashedPassword) ? (delete user.dataValues.hashedPassword && user) : null;
  };

  // 通过名字搜索用户信息
  User.findByName = async function(name) {
    return this.queryUser({ name });
  };

  // 通过用户唯一标识搜索用户信息
  User.findByLid = async function(lid) {
    return this.queryUser({ lid });
  };

  // 通过用户表字段搜索用户信息
  User.queryUser = async function(params) {
    return this.findOne({
      where     : params,
      attributes: ['id', 'name', 'lid', 'avatar', 'hashedPassword'],
    });
  };

  // 记录用户登录时间
  User.prototype.logSignin = async function() {
    return this.update({ lastSignInAt: new Date() });
  };

  return User;
};
